package net.fltx.taskmgr.win32api;

import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;

/**
 * gdi+绘图库
 */
public interface GdiPlus extends StdCallLibrary {
    public static GdiPlus INSTANCE = Native.load("GdiPlus", GdiPlus.class);//加载系统GdiPlus DLL文件，也可以是C++写的DLL文件
    static final int Alpha = 262144;    //像素数据包含没有进行过自左乘的 alpha 值。
    static final int Canonical = 2097152;//默认像素格式，每像素 32 位。 此格式指定 24 位颜色深度和一个 8 位 alpha 通道。
    static final int DontCare = 0;    //没有指定像素格式。
    static final int Extended = 1048576;//保留。
    static final int Format16bppArgb1555 = 397319;//像素格式为每像素 16 位。 该颜色信息指定 32,768 种色调，其中 5 位为红色，5 位为绿色，5 位为蓝色，1 位为 alpha。
    static final int Format16bppGrayScale = 1052676;    //像素格式为每像素 16 位。 该颜色信息指定 65536 种灰色调。
    static final int Format16bppRgb555 = 135173;//指定格式为每像素 16 位；红色、绿色和蓝色分量各使用 5 位。 剩余的 1 位未使用。
    static final int Format16bppRgb565 = 135174;//指定格式为每像素 16 位；红色分量使用 5 位，绿色分量使用 6 位，蓝色分量使用 5 位。
    static final int Format1bppIndexed = 196865;//指定像素格式为每像素 1 位，并指定它使用索引颜色。 因此颜色表中有两种颜色。
    static final int Format24bppRgb = 137224;//指定格式为每像素 24 位；红色、绿色和蓝色分量各使用 8 位。
    static final int Format32bppArgb = 2498570;//指定格式为每像素 32 位；alpha、红色、绿色和蓝色分量各使用 8 位。
    static final int Format32bppPArgb = 925707;//指定格式为每像素 32 位；alpha、红色、绿色和蓝色分量各使用 8 位。 根据 alpha 分量，对红色、绿色和蓝色分量进行自左乘。
    static final int Format32bppRgb = 139273;//指定格式为每像素 32 位；红色、绿色和蓝色分量各使用 8 位。 剩余的 8 位未使用。
    static final int Format48bppRgb = 1060876;//指定格式为每像素 48 位；红色、绿色和蓝色分量各使用 16 位。
    static final int Format4bppIndexed = 197634;//指定格式为每像素 4 位而且已创建索引。
    static final int Format64bppArgb = 3424269;//指定格式为每像素 64 位；alpha、红色、绿色和蓝色分量各使用 16 位。
    static final int Format64bppPArgb = 1851406;//指定格式为每像素 64 位；alpha、红色、绿色和蓝色分量各使用 16 位。 根据 alpha 分量，对红色、绿色和蓝色分量进行自左乘。
    static final int Format8bppIndexed = 198659;//指定格式为每像素 8 位而且已创建索引。 因此颜色表中有 256 种颜色。
    static final int Gdi = 131072;//像素数据包含 GDI 颜色。
    static final int Indexed = 65536;//该像素数据包含颜色索引值，这意味着这些值是系统颜色表中颜色的索引，而不是单个颜色值。
    static final int Max = 15;//此枚举的最大值。
    static final int PAlpha = 524288;//像素格式包含自左乘的 alpha 值。
    static final int Undefined = 0;//未定义像素格式。

    //ImageLockMode 枚举常量
    static final int ImageLockModeRead = 0x0001;//指定图像的一部分被锁定以供阅读。
    static final int ImageLockModeWrite = 0x0002;//指定图像的一部分被锁定以进行写入。
    static final int ImageLockModeUserInputBuf = 0x0004;//指定用于读取或写入像素数据的缓冲区由用户分配。如果该标志置位，则GdipBitmapLockBits函数的lockedBitmapData参数用作输入参数（可能作为输出参数）。如果该标志被清除，则lockedBitmapData参数仅用作输出参数。


    /**
     * @param hicon   处理Microsoft ®Windows ®图形设备界面（GDI）图标句柄。
     * @param pbitmap 指向DWORD变量的指针，该变量接收到Bitmap对象的指针。
     * @return
     */
    int GdipCreateBitmapFromHICON(int hicon, IntByReference pbitmap);

    /**
     * @param bitmap           位图对象指针
     * @param rect             指向要锁定的位图部分的矩形指针。 {@link Rect}
     * @param flags            一组标志，指定位图的锁定部分是否可用于读取或写入以及调用者是否已经分配了缓冲区。个别标志在ImageLockMode枚举中定义。
     * @param format           长整数值，用于指定临时缓冲区中像素数据的格式。临时缓冲区的像素格式不必与此Bitmap对象的像素格式相同。
     * @param lockedBitmapData 指向BitmapData对象的指针。
     * @return
     */
    int GdipBitmapLockBits(int bitmap, Rect rect, int flags, int format, BitmapData lockedBitmapData);

    /**
     * 解锁位图
     *
     * @param bitmap           指向位图对象的指针。
     * @param lockedBitmapData 指向以前传递给GdipBitmapLockBits的BitmapData结构的指针。
     * @return
     */
    int GdipBitmapUnlockBits(int bitmap, BitmapData lockedBitmapData);

    /**
     * 获取图像宽度
     *
     * @param image 图像对象指针
     * @param width 传回图像宽度
     * @return
     */
    int GdipGetImageWidth(int image, IntByReference width);

    /**
     * @param image  图像对象指针
     * @param height 传回图像高度
     * @return
     */
    int GdipGetImageHeight(int image, IntByReference height);

    /**
     * 释放图像资源
     * @param image 位图对象指针
     * @return
     */
    int GdipDisposeImage(int image);
}
